package cn.edu.zut.pms.faker;

import com.github.javafaker.Faker;
import java.sql.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.Random;

public class FakerOrderBase {
    public static void main(String[] args) {
        // 数据库连接信息（请根据实际环境修改）
        String url = "jdbc:mysql://192.168.17.150:3306/soil?allowPublicKeyRetrieval=true&useSSL=false";
        String user = "root";
        String password = "000000";

        // 创建中文Faker实例
        Faker faker = new Faker(new Locale("zh_CN"));
        Random random = new Random();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        // 定义货品类型（与物流数据表保持一致）
        String[] products = {"电子产品", "服装鞋帽", "食品饮料", "家居用品", "图书文具", "美妆个护"};

        try (Connection connection = DriverManager.getConnection(url, user, password)) {
            // 插入数据的SQL语句
            String insertSql = "INSERT INTO dwd_order_base (" +
                    "order_id, sales_time, delivery_time, product, quantity, sales_amount" +
                    ") VALUES (?, ?, ?, ?, ?, ?)";

            try (PreparedStatement preparedStatement = connection.prepareStatement(insertSql)) {
                // 生成500条订单基础数据（可调整数量）
                for (int i = 0; i < 500; i++) {
                    // 生成唯一订单号（ORD前缀+8位数字）
                    String orderId = "ORD" + faker.number().numberBetween(10000000, 99999999);

                    // 生成销售时间（近6个月内随机时间）
                    LocalDateTime salesTime = LocalDateTime.now()
                            .minusDays(faker.number().numberBetween(0, 180))
                            .minusHours(faker.number().numberBetween(0, 24));

                    // 生成交货时间（销售时间后2-72小时，模拟物流时效）
                    LocalDateTime deliveryTime = salesTime.plusHours(faker.number().numberBetween(2, 72));

                    // 随机选择货品类型
                    String product = products[random.nextInt(products.length)];

                    // 生成数量（1-30件，不同品类略有差异）
                    int quantity;
                    if (product.equals("电子产品") || product.equals("家居用品")) {
                        quantity = faker.number().numberBetween(1, 5); // 高价值商品数量较少
                    } else {
                        quantity = faker.number().numberBetween(1, 30);
                    }

                    // 生成销售金额（根据品类设置单价范围，金额=数量×单价）
                    double unitPrice;
                    switch (product) {
                        case "电子产品":
                            unitPrice = faker.number().randomDouble(2, 500, 5000);
                            break;
                        case "家居用品":
                            unitPrice = faker.number().randomDouble(2, 100, 2000);
                            break;
                        case "服装鞋帽":
                        case "美妆个护":
                            unitPrice = faker.number().randomDouble(2, 50, 500);
                            break;
                        case "食品饮料":
                            unitPrice = faker.number().randomDouble(2, 10, 100);
                            break;
                        case "图书文具":
                            unitPrice = faker.number().randomDouble(2, 5, 50);
                            break;
                        default:
                            unitPrice = faker.number().randomDouble(2, 30, 300);
                    }
                    double salesAmount = quantity * unitPrice;

                    // 设置参数
                    preparedStatement.setString(1, orderId);
                    preparedStatement.setString(2, salesTime.format(formatter));
                    preparedStatement.setString(3, deliveryTime.format(formatter));
                    preparedStatement.setString(4, product);
                    preparedStatement.setInt(5, quantity);
                    preparedStatement.setDouble(6, salesAmount);

                    preparedStatement.executeUpdate();
                }
                System.out.println("数据插入完成，共插入 500 条订单基础信息记录");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}